-- 1.参数列表

-- 优惠券id
local voucherId = ARGV[1]
-- 用户id
local userId = ARGV[2]
-- 订单id
local orderId = ARGV[3]

-- 参数校验
if voucherId == nil or voucherId == "" or
        userId == nil or userId == "" or
        orderId == nil or orderId == "" then
    return -1  -- 参数非法
end

-- 2.数据key
local stockKey = 'seckill:stock:' .. voucherId
local orderKey = 'seckill:order:' .. voucherId

-- 3.1 检查库存是否存在
local stock = redis.call('GET', stockKey)
if stock == nil or stock == "" then
    return 1  -- 库存键不存在
end

-- 3.2 转换为数字并判断
local stockNum = tonumber(stock)
if stockNum == nil then
    return 1  -- 库存值无法转为数字
end

if stockNum <= 0 then
    return 1  -- 库存不足
end


-- 3.3 判断是否重复下单
if redis.call('SISMEMBER', orderKey, userId) == 1 then
    return 2  -- 重复下单
end

-- 4.扣减库存并记录订单
redis.call('INCRBY', stockKey, -1)
redis.call('SADD', orderKey, userId)

-- 5.发送消息到Stream
redis.call('XADD', 'stream.orders', '*',
        'voucherId', voucherId,
        'userId', userId,
        'id', orderId
)

return 0  -- 成功